﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using TumbaloSoft.Models;
using System.Collections;
using TumbaloSoft.Helpers;
using TumbaloSoft.Helpers.QueryObjects;
using iTextSharp.text;

namespace TumbaloSoft.Controllers
{
    public class VendedorController : TumbaloController
    {

        private static Object lockObject = new Object();

        //
        // GET: /Inmueble/

        public ActionResult Index(BusquedaVendedor vendedorBuscar)
        {
            if (defaultAction != null) return defaultAction;
              int numActivos =0 ;		    
		      try
		      {
				 numActivos = HelperVendedor.selectCountActivos();                 
				 ViewBag.ListaVendedor = HelperVendedor.buscar(vendedorBuscar);
		      }
              catch (Exception ex)
              {
                  Logger.Current.Error("Error al intentar cargar la lista de vendedores", ex);
                  return View("~/Views/Shared/Error.cshtml");
		      }

          ViewBag.prevPage = vendedorBuscar.prPage - 1;
          ViewBag.nextPage = vendedorBuscar.prPage + 1;
          ViewBag.numPages = numActivos / vendedorBuscar.prPageSize;
          if ((numActivos % vendedorBuscar.prPageSize) > 0) ViewBag.numPages++;
            
		  return View(vendedorBuscar);
        }

        public ActionResult Registrar()
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                ViewBag.listaTipo = HelperTipoDocumento.selectAll();
                ViewBag.listaDistrito = HelperDistrito.selectAll();
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar registrar al vendedor", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
            return View();
        }

        [HttpPost]
        public ActionResult Registrar(Vendedor vendedor)
        {
            if (defaultAction != null) return defaultAction;
            try
            {   //Llamar a todas las listas que se utilizan
			  ViewBag.codigo = HelperVendedor.SiguienteCodigo();
                ViewBag.listaDistrito = HelperDistrito.selectAll();
                ViewBag.listaTipo = HelperTipoDocumento.selectAll();
                vendedor.prTipoEmpleadoTumbalo = new TipoEmpleadoTumbalo();
                vendedor.prTipoEmpleadoTumbalo.prIdTipoEmpleado=1;

			 Boolean existe = HelperVendedor.ExistePersona(vendedor.prCodigoDocumento);
                Boolean esMayor = EsMayorEdad(vendedor.prFechaNacimiento);
                vendedor.prEstado = "ACTIVO";

                if (existe == true)
                {
                    ModelState.AddModelError("prCodigoDocumento", "Ya existe la persona");
                    return View(vendedor);
                }
                if (esMayor == false)
                {
                    ModelState.AddModelError("prFechaNacimiento", "La persona debe de ser mayor de edad");
                    return View(vendedor);
                }
                else if (ModelState.IsValid)
                {
                    lock (lockObject)
                    {
                        vendedor.prIdPersona = (int)(HelperPersonaNatural.SiguienteCodigo());
                        vendedor.prIdVendedor = (int)(HelperVendedor.SiguienteCodigo()); //<!--codigo decimal empleado-->                               
                        HelperVendedor.insert(vendedor);
                        AccountController.crearCuenta((PersonaNatural)vendedor, 5);//5 ES UN VENDEDOR
                    }
                    ViewBag.mensaje = "Se registro correctamente al vendedor " + vendedor.prNombre + " " + vendedor.prApellidoPaterno;
                    ViewBag.returnURL = "/Vendedor/Index";
                    return View("~/Views/Shared/Exito.cshtml");
                }
                else return View(vendedor);
           }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar registrar al vendedor", ex);
             return View("~/Views/Shared/Error.cshtml");
           }
        }

        public ActionResult Modificar(int? prIdVendedor, BusquedaVendedor vendedorBuscar)
        {
            if (defaultAction != null) return defaultAction;
            if (!prIdVendedor.HasValue)
            {
                return View("~/Views/Shared/Error.cshtml");
            }
            else
            {
                try
                {
                    ViewBag.listaTipo = HelperTipoDocumento.selectAll();
                    ViewBag.listaDistrito = HelperDistrito.selectAll();
                    ViewBag.ListaVendedor = HelperVendedor.buscar(vendedorBuscar);
                    Vendedor vendedor = HelperVendedor.selectById(prIdVendedor.Value);
                    if (vendedor == null) return View();//si el vendedor no se encontro  
                    else return View(vendedor);
                }
                catch (Exception ex)
                {
                    Logger.Current.Error("Error al intentar modificar al vendedor", ex);
                    return View("~/Views/Shared/Error.cshtml");
                }
            }
        }

        [HttpPost]
        public ActionResult Modificar(Vendedor vendedor, BusquedaVendedor vendedorBuscar)
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                ViewBag.listaTipo = HelperTipoDocumento.selectAll();
                ViewBag.listaDistrito = HelperDistrito.selectAll();
			 ViewBag.ListaVendedor = HelperVendedor.buscar(vendedorBuscar);
                Boolean esMayor = EsMayorEdad(vendedor.prFechaNacimiento);
                if (esMayor == false)
                {
                    ModelState.AddModelError("prFechaNacimiento", "La persona debe de ser mayor de edad");
                    return View(vendedor);
                }

                else if (ModelState.IsValid)
                {
                    ViewBag.listaTipo = HelperTipoDocumento.selectAll();
                    ViewBag.listaDistrito = HelperDistrito.selectAll();
				    int idPersona = HelperVendedor.IdPersona(vendedor.prIdVendedor);
                    vendedor.prIdPersona = idPersona;
				    HelperVendedor.update(vendedor);
                    ViewBag.mensaje = "Se modifico correctamente al vendedor " + vendedor.prNombre + " " + vendedor.prApellidoPaterno;
                    ViewBag.returnURL = "/Vendedor/Index";
                    return View("~/Views/Shared/Exito.cshtml");
                }

            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar modificar al vendedor", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
            return View(vendedor);
        }

        public ActionResult Eliminar(int? prIdVendedor, BusquedaVendedor vendedorBuscar)
        {
            if (defaultAction != null) return defaultAction;
            if (!prIdVendedor.HasValue)
            {
                return View("~/Views/Shared/Error.cshtml");
            }
            else
            {
                try
                {
                    ViewBag.listaTipo = HelperTipoDocumento.selectAll();
                    ViewBag.listaDistrito = HelperDistrito.selectAll();
				ViewBag.ListaVendedor = HelperVendedor.buscar(vendedorBuscar);
				Vendedor vendedor = HelperVendedor.selectById(prIdVendedor.Value);
                    if (vendedor == null) return View();//si el vendedor no se encontro
                    else return View(vendedor);
                }
                catch (Exception ex)
                {
                    Logger.Current.Error("Error al intentar eliminar al vendedor", ex);
                    return View("~/Views/Shared/Error.cshtml");
                }
            }
        }

        [HttpPost]
        public ActionResult Eliminar(Vendedor vendedor, BusquedaVendedor vendedorBuscar)
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                ViewBag.listaTipo = HelperTipoDocumento.selectAll();
                ViewBag.listaDistrito = HelperDistrito.selectAll();
			    ViewBag.ListaVendedor = HelperVendedor.buscar(vendedorBuscar);
                //Eliminar un vendedor tambien se debe poner el idvendedor=1 y estado='pendiente' a cita
                ViewBag.Citas = HelperCita.selectAll();
                foreach (Cita c in ViewBag.Citas)
                {
                    Cita cita = HelperCita.selectById(c.prIdCita);
                    if ((cita.prEmpleado.prIdVendedor == vendedor.prIdVendedor) && (cita.prEstado == "APROBADO"))
                    {                        
                        cita.prEmpleado.prIdVendedor = 1;
                        cita.prEstado = "PENDIENTE";
                        HelperCita.update(cita);
                    }

                }                
			    HelperVendedor.delete(vendedor);
                ViewBag.mensaje = "Se elimino correctamente al vendedor " + vendedor.prNombre + " " + vendedor.prApellidoPaterno;
                ViewBag.returnURL = "/Vendedor/Index";
                return View("~/Views/Shared/Exito.cshtml");
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar eliminar al vendedor", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
        }



        public Boolean EsMayorEdad(DateTime fechaNacimiento)
        {
            try
            {
                int edad = DateTime.Today.Year - fechaNacimiento.Year;
                if (new DateTime(DateTime.Today.Year, fechaNacimiento.Month, fechaNacimiento.Day) > DateTime.Today) edad--;
                if (edad > 18 && edad < 65) return true;
                else return false;
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error en la edad", ex);
                return false;
            }
        }
        
    }
}
    